package spring.task;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import spring.bean.Mali;

import java.util.Date;
//Bean 注册优先级
//具有 @ComponentScan注解的bean优先注册
//具有 @Configuration 注解的bean
//具有 @Controller @Service @Repository @Component 等常用注解的bean
//被@Import注解导入的Bean
//被 实现了ImportSelector接口的类导入的Bean
//被 实现了ImportBeanDefinitionRegistrar接口的类导入的Bean
//被 BeanDefinitionRegistry 动态注入的Bean (属于懒加载，在没有被Spring进行getBean查找时，不会执行初始化方法)
//Bean注册顺序
//同一个级别的spring容器载入bean顺序是不确定的，spring框架没有约定特定顺序逻辑规范。
//但spring保证如果A依赖B (如beanA中有@Autowired B的变量)，那么B将先于A被加载。
//
//@DependsOn
//如果A不依赖B，但是A需要在B后面初始化，可以使用@DependsOn（value=“Bbeanname”）。
//B的@Bean上面需要手动指定Name,否则找不到。

@EnableScheduling
@EnableAsync
@Configuration
@ComponentScan({"spring.bean","spring.listener","spring.task"})
@PropertySource("classpath:test.properties")
public class MainConfiguration {
//    @Scheduled(fixedRate = 2000)   //单位依然是毫秒，这里是每两秒钟打印一次
    public void task(){
        System.out.println("我是定时任务！"+new Date());
    }
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Mali mali(){
        return new Mali();
    }
}
